package global

import (
	"sync"
)

/**
	数据搬表类型的数据配置
 */
type Task struct {
	TaskId string `json:"taskId"` //任务的id
	TaskName string `json:"taskName"`//任务的名称
	TaskCommand string `json:"taskCommand"`//任务的配置
	IsUse bool `json:"isUse"` //是否使用，如果是true,表明该配置是生效的
	Cron string `json:"cron"` //cron表达式，如果配置了，表示任务是以cron配置实现的。表示是定时任务。不配置，则是在云上进行触发，触发以后，只要能查询出数据，就会一直执行下去，表示流式任务
	IsFlow bool `json:"isFlow"` //配置定时任务是否以流式的方式执行。详情见README.md
	Speed int64 `json:"speed"` //程序休眠时长，单位毫秒,流式任务，或者定时任务流式执行，配置上一个轮次执行完休眠多少秒，继续下一轮执行。这个是对此类型的任务进行限速
	Thread int `json:"thread"` //用来处理任务的协程数
	ShardingCount int `json:"sharding-count"` //支持分片。这里配置的是分片数。如果配置了分片数，则不再支持流式任务，只支持触发一次的任务
	ShardingColumn string `json:"sharding-column"` //分片键
	SrcIp string `json:"src-ip"` //搬表原始数据库的数据库ip地址
	SrcPort string `json:"src-port"`//搬表原始数据库的数据库的port端口
	SrcCharacterEncoding string `json:"src-characterEncoding"` //搬表原始数据库的编码
	SrcDatabase string `json:"src-database"` //搬表的原始数据库的数据库地址
	SrcTable string  `json:"src-table"` //搬表原始数据库的搬表的表名
	SrcUsername string `json:"src-username"` //搬表原始数据库的登陆用户名
	SrcPassword string `json:"src-password"` //搬表原始数据库的密码
	SrcMaxOpenConns int `json:"src-maxOpenConns"` //搬表原始数据库的最大连接数
	SrcMaxIdleConns int `json:"src-maxIdleConns"` //搬表原始数据库的最大空闲连接
	SrcLimit int `json:"src-limit"` //查询的数据的条数limit,搬表时可能会使用到。不配置则不会进行分页查询
	SrcKey string `json:"src-key"` //主键。数据搬迁成功后，会根据主键进行delete
	SrcCondition string `json:"src-condition"` //查询条件，参数都用?号替代，也是 where 后面的句子
	SrcParameter []string `json:"src-parameter"` //SrcCondition的条件。
	SrcQuery string  `json:"src-query"` //如果是数据搜集任务，sql会很复杂，可能会多表JOIN联查，需要直接配置sql。此时，SrcLimit，SrcCondition，SrcParameter的配置会失效，以SrcQuery为准。
	SrcDelete bool `json:"scr-delete"` //数据写到目标库以后，能否删除原始数据库对应的数据，默认是false，如果是简单的搬表服务，需要配置为true。
	TargetIp string `json:"target-ip"` //要搬表的目标数据库的ip地址
	TargetPort string `json:"target-port"` //要搬表的目标数据库的端口号
	TargetCharacterEncoding string `json:"target-characterEncoding"` //要搬表的目标数据库的字符集编码
	TargetDatabase string `json:"target-database"` //要搬表的数据库的数据库名。
	TargetTable string `json:"target-table"` //要搬表的对方目标数据库的表名
	TargetUsername string `json:"target-username"` //要搬表的目标数据库的用户名
	TargetPassword string `json:"target-password"` //要搬表的目标数据库的密码
	TargetMaxOpenConns int `json:"target-maxOpenConns"` //要搬表的目标数据库的最大连接数
	TargetMaxIdleConns int `json:"target-maxIdleConns"` //要搬表的目标数据库的最大空闲连接数
	TargetBeforeSql string `json:"target-beforeSql"` //在执行向目标数据库写入数据时的前置sql。支持分片
	TargetShardingColumn string `json:"target-sharding-column"` //如果任务是分片任务，前置sql需要配置目标库的分片键。和TargetBeforeSql搭配使用
	TargetColumnMapping map[string]string `json:"target-column-mapping"` //原始表的表的列与目标表的列的映射（有时候两边的表结构不一样，需要配置，如果不配置，则默认使用原始表查询出来的列）,对TargetType="insert"和TargetType="update"都生效
	TargetType string `json:"target-type"` //对目标库的操作类型：两个值："insert"和"update",insert表示入库，update表示对某些字段进行更新
	TargetUpdateCondition map[string]string `json:"target-update-condition"` //当TargetType为update时，此时的操作类型是update，则需要配置根据哪些列进行update。假如配置了{"id":"cid","userName":"cuserName"} 则sql为 update tableName set TargetColumnMapping配置的列 where id=${cid} and userName=${cuserName}
	ExcludeColumn map[string]string `json:"excludeColumn"`//存储时是否排除一些列。当TargetColumnMapping配置为空的时候，并且TargetType 为insert时，该配置才生效，表示两个完全一样的表结构，搬到对方的时候，排除一些列。比如，不保留主键，则排除主键。列名即为map的key TargetColumnMapping配置不为空的时候，TargetColumnMapping本身就能实现该功能，不用配置ExcludeColumn

}
/**
	全局配置
 */
type ConfigGlobal struct {
	Namespace string `json:"namespace"` //命名空间，一个服务一个命名空间
	Zookeeper string `json:"zookeeper"` //zookeeper命名空间，当此值不为Null时，表示该工作需要上Zk控制台，否则，代表无需zk，纯本地服务
	Tasks []*Task `json:"tasks"` //简单搬表的任务列表

}
/**
	全局变量
 */
var (
	ConfigFile string
	config     *ConfigGlobal
	configLock = new(sync.RWMutex)
)